package bio_nio_aio.bio.com_base.junjie;

import java.io.InputStream;
import java.io.OutputStream;
import java.net.Socket;
/*
 * TCP通信的客户端：向服务器发送数据，读取服务器写的数据
 * 表示客户端的类：
 * java.net.Socket此类实现客户端套接字（也可以就叫“套接字”）。套接字是两台机器间通信的端点。
 * 套接字：包含了IP地址和端口号的网络单位
 *
 * 构造方法：
 * Socket(String host, int port) ip和 端口号
          创建一个流套接字并将其连接到指定主机上的指定端口号。
 *
 * 成员方法：来获取输入流和输出流
 *
 *OutputStream getOutputStream();
 *InputStream getInputStream();
 *void close();
 *
 * 实现步骤：
 * 1.创建一个客户端对象Socket，构造方法绑定服务器的 ip 地址和 port
 * 2.使用 Socket 对象中的 getOutputStream() 获取网络字节输出流 OutputStream 对象
 * 3.使用 OutputStream 输出流中的方法write 给服务器发数据
 * 4.使用Socket 对象中的方法 getInputStream() 获取网络字节输入流 InputStream()对象
 * 5.使用网络字节输入流 InputStream()对象中的 read()方法
 * 6.释放资源
 *
 * notice:
 * 1.客户端和服务器进行交互，必须使用 Socket 中提供的网络流，不能使用自己创建的流对象
 * 2.当我们创建客户端对象的时候，就会去请求服务器和服务器进行三次握手建立网络通路这时
 * 如果服务器没有启动就会抛出异常，如果服务器已经启动就可以进行交互了
 *
 * */
public class TCPClient {
	public static void main(String[] args) throws Exception {
		//1.创建一个客户端 Socket ，构造方法绑定服务器的 IP 地址和端口号
		//获取一个套接字
		Socket socket = new Socket("127.0.0.1",8888);
		//2.使用 Socket 对象中的方法 getOutputStream()获取网络字节输出流 OutputStream()对象
		OutputStream os = socket.getOutputStream();
		//3.使用网络字节输出流 OutputStream()对象中的方法 write ，给服务器发送数据
		os.write("你好服务器".getBytes());
		//4.使用Socket 对象中的方法 getInputStream() 获取网络字节输入流 InputStream()对象
		InputStream is = socket.getInputStream();

		byte[] bytes = new byte[1024];
		//5.使用网络字节输入流 InputStream()对象中的 read()方法
		int len = is.read(bytes);
		System.out.println(new String(bytes,0,len));
		//6.释放资源
		os.close();
	}
}